package com.ewili.framework.utils;

import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.apache.commons.lang3.StringEscapeUtils;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;

/**
 * 字符串操作工具类
 *
 * @author leo
 */
public final class StringUtils extends org.apache.commons.lang3.StringUtils {

    private static char[] SPECIAL_CHARS = {'(', ')', '[', ']', '{'
            , '}', '-', '?', '*', '+'
            , '.', '$', '^', '/'};

    private StringUtils() {
    }

    /**
     * 截取
     *
     * @param content
     * @param startCutKeyWord
     * @param endCutKeyWord
     * @return
     */
    public static String substring(String content, String startCutKeyWord,
                                   String endCutKeyWord) {
        int startCutIndex = content.indexOf(startCutKeyWord);
        int endCutIndex = content.indexOf(endCutKeyWord);
        String part = content.substring(startCutIndex, endCutIndex);
        return part;
    }

    /**
     * 截取
     *
     * @param content
     * @param startCutKeyWord
     * @return
     */
    public static String subString(String content, String startCutKeyWord) {
        int startWordIndex = content.indexOf(startCutKeyWord);
        String part = content.substring(startWordIndex);
        return part;
    }

    /**
     * 获取文本中的前maxLength个 超出部分使用……补充
     *
     * @param text
     * @param maxLength
     * @return
     */
    public static String head(String text, int maxLength) {
        if (text == null) {
            return null;
        }
        if (text.length() <= maxLength) {
            return text;
        }
        return text.substring(0, maxLength) + "……";
    }

    /**
     * 将html转码，例如"&" -> "&amp;"
     *
     * @param input
     * @return
     */
    public static String escapeHtml(String input) {
        return StringEscapeUtils.escapeHtml4(input);
    }

    /**
     * 将html反转码，例如"&amp;" -> "&"
     *
     * @param input
     * @return
     */
    public static String unescapeHtml(String input) {
        return StringEscapeUtils.unescapeHtml4(input);
    }

    /**
     * 将字符串转码，例如"中文" -> "\u4E2D\u6587"
     *
     * @param input
     * @return
     */
    public static String escape(String input) {
        return StringEscapeUtils.escapeJava(input);
    }

    /**
     * 将字符串反转码，例如"\u4E2D\u6587" -> "中文"
     *
     * @param input
     * @return
     */
    public static String unescape(String input) {
        return StringEscapeUtils.unescapeJava(input);
    }

    /**
     * getBytes
     *
     * @param input
     * @param charset
     * @return
     */
    public static byte[] getBytes(String input, String charset) {
        if (input == null) {
            return null;
        }
        try {
            return input.getBytes(charset);
        } catch (UnsupportedEncodingException e) {
            throw ExceptionUtils.propagate(e);
        }
    }

    /**
     * getBytes
     *
     * @param input
     * @param charset
     * @return
     */
    public static byte[] getBytes(String input, Charset charset) {
        if (input == null) {
            return null;
        }
        return input.getBytes(charset);
    }

    /**
     * 将byte数组转换为16进制的字符串
     *
     * @param bytes
     * @return 返回字符串长度是bytes.length * 2
     */
    public static String encodeHex(final byte[] bytes) {
        return new String(Hex.encodeHex(bytes));
    }

    /**
     * 将16进制字符串转为byte数组
     *
     * @param data
     * @return 返回的byte数组的长度是data.length() / 2
     */
    public static byte[] decodeHex(String data) {
        try {
            return Hex.decodeHex(data.toCharArray());
        } catch (DecoderException e) {
            throw ExceptionUtils.propagate(e);
        }
    }

    /**
     * 将byte数组转换为base64的字符串
     * base64算法: 3byte -> 4byte 高两位补零
     *
     * @param bytes
     * @return 返回字符串长度是bytes.length * (4/3)。
     */
    public static String encodeBase64(final byte[] bytes) {
        return new String(Base64.encodeBase64(bytes),
                GlobalConstant.UTF8_CHARSET);
    }

    /**
     * 将base64的字符串转为byte数组
     *
     * @param data
     * @return 返回的byte数组的长度是data.length() / (4/3)
     */
    public static byte[] decodeBase64(String data) {
        return Base64.decodeBase64(getBytes(data, GlobalConstant.UTF8_CHARSET));
    }

    /**
     * 使用等号对base64补齐。
     * （可解决base64用于补齐的等号在cookie中被截断的问题）
     *
     * @param base64
     * @return
     */
    public static String ensureBase64Padding(String base64) {
        int length = base64.length();
        if (length % 4 != 0) {
            StringBuilder builder = new StringBuilder(base64);
            for (int i = 0; i < length % 4; ++i) {
                builder.append('=');
            }
            base64 = builder.toString();
        }
        return base64;
    }

    /**
     * 清除base64的补齐等号。
     *
     * @param base64
     * @return
     */
    public static String removeBase64Padding(String base64) {
        int length = base64.length();
        if (length < 4) {
            return base64;
        }
        int i = 0;
        for (; i < 3; i++) {
            if (base64.charAt(length - 1 - i) != '=') {
                break;
            }
        }
        return base64.substring(0, length - i);
    }

    /**
     * 是否為正則表達特殊字符
     * 特殊字符列表15個 (    [     {    /    ^    -    $     ¦    }    ]    )    ?    *    +    .
     * 已經去掉'|'，因爲數據庫匹配分割使用了'|'
     *
     * @param specialChar
     * @return
     */
    public static boolean isSpecialChar(String specialChar) {
        for (char charToCompare : SPECIAL_CHARS) {
            if (specialChar.equalsIgnoreCase(String.valueOf(charToCompare))) {
                return true;
            }
        }
        return false;
    }
}
